package tas.dao.impl;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import tas.dao.DaoTrabajadores;
import tas.domain.Trabajadores;
import tas.sql.ConectaDb;

public class DaoTrabajadoresImpl implements DaoTrabajadores {

    private final ConectaDb db;

    public DaoTrabajadoresImpl() {
        this.db = new ConectaDb();
    }

    @Override
    public List<Object[]> trabajadoresQry(String filtro) {
        List<Object[]> list = null;
        String sql = "SELECT TRA.IDTRABAJADOR,  "
                + " TRA.IDTRABAJADORCORE, "
                + "  VIS_TRA.IDESTADOSIGA IDESTADO, "
                + " VIS_TRA.APELLIDOPATERNO   ||  ' ' ||  VIS_TRA.APELLIDOMATERNO ||  ', ' || VIS_TRA.NOMBRE TRABAJADOR, "
                + "  VIS_TRA.NUMERODOCUMENTOIDENTIDAD, "
                + " NVL(VIS_DEP.DESCRIPCIONDEPENDENCIA, ' ' ) DEPENDENCIA, "
                + " NVL(VIS_AREA.DESCRIPCIONAREAS , ' ' )  AREAS, "
                + " CASE WHEN VIS_TRA.IDESTADOSIGA='1' THEN 'ACTIVO' ELSE 'INACTIVO' END ESTADO "
                + " FROM BDTAS.TRABAJADOR TRA "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + "ON (VIS_TRA.IDTRABAJADORCORE=TRA.IDTRABAJADORCORE) "
                + "LEFT JOIN ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP "
                + "ON (VIS_TRA.IDAÑO = VIS_DEP.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_DEP.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE = VIS_DEP.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_DEP.IDDEPENDENCIACORE) "
                + "LEFT JOIN ADMINPJ.V_PER_AREASPJ VIS_AREA "
                + "ON (VIS_TRA.IDAÑO = VIS_AREA.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_AREA.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE = VIS_AREA.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_AREA.IDDEPENDENCIACORE) "
                + "AND (VIS_TRA.CODAREAINT=VIS_AREA.CODAREAINT)"
                + " WHERE " + filtro;

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[8];

                    f[0] = rs.getObject(1); // TRA.IDTRABAJADOR
                    f[1] = rs.getObject(2); // TRA.IDTRABAJADORCORE
                    f[2] = rs.getObject(3); // IDESTADO
                    f[3] = rs.getObject(4); // TRABAJADOR
                    f[4] = rs.getObject(5); // NUMERODOCUMENTOIDENTIDAD
                    f[5] = rs.getObject(6); // DEPENDENCIA
                    f[6] = rs.getObject(7); // AREA
                    f[7] = rs.getObject(8); // AREA

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public List<Object[]> trabajadoresQry(String filtro, long numpag, long filsXpag) {
        List<Object[]> list = null;
        String sql = "SELECT * FROM " // adicional a consulta
                + "(SELECT rownum rnum, a.* FROM ( " // adicional a consulta
                + "SELECT TRA.IDTRABAJADOR,  "
                + " TRA.IDTRABAJADORCORE, "
                + "  VIS_TRA.IDESTADOSIGA IDESTADO, "
                + " VIS_TRA.APELLIDOPATERNO   ||  ' ' ||  VIS_TRA.APELLIDOMATERNO ||  ', ' || VIS_TRA.NOMBRE TRABAJADOR, "
                + "  VIS_TRA.NUMERODOCUMENTOIDENTIDAD, "
                + " NVL(VIS_DEP.DESCRIPCIONDEPENDENCIA, ' ' ) DEPENDENCIA, "
                + " NVL(VIS_AREA.DESCRIPCIONAREAS , ' ' )  AREAS, "
                + " CASE WHEN VIS_TRA.IDESTADOSIGA='1' THEN 'ACTIVO' ELSE 'INACTIVO' END ESTADO "
                + " FROM BDTAS.TRABAJADOR TRA "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + "ON (VIS_TRA.IDTRABAJADORCORE=TRA.IDTRABAJADORCORE) "
                + "LEFT JOIN ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP "
                + "ON (VIS_TRA.IDAÑO = VIS_DEP.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_DEP.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE = VIS_DEP.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_DEP.IDDEPENDENCIACORE) "
                + "LEFT JOIN ADMINPJ.V_PER_AREASPJ VIS_AREA "
                + "ON (VIS_TRA.IDAÑO = VIS_AREA.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_AREA.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE = VIS_AREA.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_AREA.IDDEPENDENCIACORE) "
                + "AND (VIS_TRA.CODAREAINT=VIS_AREA.CODAREAINT)"
                + " WHERE " + filtro
                + ") a WHERE rownum <=?) " // adicional a consulta
                + "WHERE rnum > ?"; // adicional a consulta;

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setLong(1, ((1 + numpag) * filsXpag));
                ps.setLong(2, (numpag * filsXpag));
                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[8];

                    f[0] = rs.getObject(1); // TRA.IDTRABAJADOR
                    f[1] = rs.getObject(2); // TRA.IDTRABAJADORCORE
                    f[2] = rs.getObject(3); // IDESTADO
                    f[3] = rs.getObject(4); // TRABAJADOR
                    f[4] = rs.getObject(5); // NUMERODOCUMENTOIDENTIDAD
                    f[5] = rs.getObject(6); // DEPENDENCIA
                    f[6] = rs.getObject(7); // AREA
                    f[7] = rs.getObject(8); // AREA

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public Integer[] trabajadoresQryPag(String filtro, long filsXpag) {
        Integer[] result = null;
        String sql = "SELECT COUNT(*) "
                + " FROM BDTAS.TRABAJADOR TRA "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + "ON (VIS_TRA.IDTRABAJADORCORE=TRA.IDTRABAJADORCORE) "
                + "LEFT JOIN ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP "
                + "ON (VIS_TRA.IDAÑO = VIS_DEP.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_DEP.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE = VIS_DEP.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_DEP.IDDEPENDENCIACORE) "
                + "LEFT JOIN ADMINPJ.V_PER_AREASPJ VIS_AREA "
                + "ON (VIS_TRA.IDAÑO = VIS_AREA.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_AREA.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE = VIS_AREA.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_AREA.IDDEPENDENCIACORE) "
                + "AND (VIS_TRA.CODAREAINT=VIS_AREA.CODAREAINT)"
                + " WHERE " + filtro;

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);

                ResultSet rs = ps.executeQuery();

                if (rs.next()) {
                    // total filas de consulta
                    Integer totalfils = rs.getInt(1);

                    // cantidad de paginas con filsXpag
                    Integer ctasPags = (totalfils % filsXpag) == 0
                            ? (totalfils / (int) filsXpag)
                            : (totalfils / (int) filsXpag + 1);

                    result = new Integer[2];
                    result[0] = ctasPags;
                    result[1] = totalfils;
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return result;
    }

    @Override
    public String trabajadoresIns(Trabajadores trabajadores) {
        String result = null;
        String sql = "INSERT INTO BDTAS.TRABAJADOR("
                + "IDSEXO,"
                + "IDTIPODOCUMENTO,"
                + "NUMERODOCUMENTOIDENTIDAD,"
                + "APELLIDOPATERNO,"
                + "APELLIDOMATERNO,"
                + "NOMBRE,"
                + "FECHAINICIO,"
                + "FECHAFIN,"
                + "IDESTADO"
                + ") VALUES(?,?,?,?,?,?,?,?,?)";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, trabajadores.getIdsexo());
                ps.setInt(2, trabajadores.getIdtipodocumento());
                ps.setString(3, trabajadores.getNumerodocumentoidentidad());
                ps.setString(4, trabajadores.getApellidopaterno());
                ps.setString(5, trabajadores.getApellidomaterno());
                ps.setString(6, trabajadores.getNombre());
                ps.setDate(7, trabajadores.getFechainicio());
                ps.setDate(8, null); // FECHAFIN == null
                ps.setInt(9, 1); // IDESTADO == 1 -- Activo

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public Trabajadores trabajadoresGet(Integer idtrabajador) {
        Trabajadores trabajadores = null;

        String sql = "SELECT  "
                + "IDTRABAJADOR,"
                + "IDSEXO,"
                + "IDTIPODOCUMENTO,"
                + "NUMERODOCUMENTOIDENTIDAD,"
                + "APELLIDOPATERNO,"
                + "APELLIDOMATERNO,"
                + "NOMBRE,"
                + "FECHAINICIO,"
                + "FECHAFIN,"
                + "IDESTADO "
                + "FROM BDTAS.TRABAJADOR WHERE IDTRABAJADOR=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, idtrabajador);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    trabajadores = new Trabajadores();

                    trabajadores.setIdtrabajador(rs.getInt(1));
                    trabajadores.setIdsexo(rs.getInt(2));
                    trabajadores.setIdtipodocumento(rs.getInt(3));
                    trabajadores.setNumerodocumentoidentidad(rs.getString(4));
                    trabajadores.setApellidopaterno(rs.getString(5));
                    trabajadores.setApellidomaterno(rs.getString(6));
                    trabajadores.setNombre(rs.getString(7));
                    trabajadores.setFechainicio(rs.getDate(8));
                    trabajadores.setFechafin(rs.getDate(9));
                    trabajadores.setIdestado(rs.getInt(10));
                }
            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return trabajadores;
    }

    @Override
    public String trabajadoresUpd(Trabajadores trabajadores) {
        String result = null;
        String sql = "UPDATE BDTAS.TRABAJADOR SET "
                + "IDSEXO=?,"
                + "IDTIPODOCUMENTO=?,"
                + "NUMERODOCUMENTOIDENTIDAD=?,"
                + "APELLIDOPATERNO=?,"
                + "APELLIDOMATERNO=?,"
                + "NOMBRE=?,"
                + "FECHAINICIO=?,"
                + "FECHAFIN=?,"
                + "IDESTADO=? "
                + "WHERE IDTRABAJADOR=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, trabajadores.getIdsexo());
                ps.setInt(2, trabajadores.getIdtipodocumento());
                ps.setString(3, trabajadores.getNumerodocumentoidentidad());
                ps.setString(4, trabajadores.getApellidopaterno());
                ps.setString(5, trabajadores.getApellidomaterno());
                ps.setString(6, trabajadores.getNombre());
                ps.setDate(7, trabajadores.getFechainicio());
                ps.setDate(8, trabajadores.getFechafin());
                ps.setInt(9, trabajadores.getIdestado());
                ps.setInt(10, trabajadores.getIdtrabajador());

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public Object[] trabajadoresCon(Integer idtrabajador) {
        Object[] f = null;

        String sql = " SELECT  VIS_TRA.NUMERODOCUMENTOIDENTIDAD, "
                + "  CASE WHEN VIS_TRA.IDESTADOSIGA='1' THEN 'ACTIVO' ELSE 'INACTIVO' END ESTADO, "
                + "  VIS_TRA.APELLIDOPATERNO   ||  ' ' ||  VIS_TRA.APELLIDOMATERNO ||  ' ' || VIS_TRA.NOMBRE TRABAJADOR, "
                + "  CASE WHEN VIS_TRA.IDSEXO='1' THEN 'FEMENINO' ELSE 'MASCULINO' END GENERO, "
                + "  VIS_TRA.FECHAINICIOPJ, "
                + " VIS_TRA.FECHAINICIO, "
                + " VIS_TRA.FECHAFIN, "
                + " VIS_TRA.CODESCALAFON, "
                + "  VIS_TRA.IDTRABAJADORCORE, "
                + "  VIS_REGLAB.DESCRIPCIONREGIMENLABORAL , "
                + " VIS_UNIDEJE.DESCRIPCIONUE , "
                + "  VIS_CORTE.DESCRIPCIONCORTE , "
                + " VIS_SEDE.DESCRIPCIONSEDE , "
                + " VIS_DEP.DESCRIPCIONDEPENDENCIA , "
                + "  VIS_AREASPJ.DESCRIPCIONAREAS, "
                + " VIS_CARGO.DESCRIPCIONCARGO, "
                + " VIS_TRA.IDPLAZA, "
                + " TO_CHAR(VIS_TRA.PERFECNAC,'DD/MM/YYYY'), "
                + " VIS_TRA.DIRECCION, "
                + "VIS_TRA.TELEFONOFIJO, "
                + " VIS_TRA.CELULAR, "
                + " VIS_TRA.CORREOELECTR  "
                + "FROM  BDTAS.TRABAJADOR  TRA "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + "ON (VIS_TRA.IDTRABAJADORCORE=TRA.IDTRABAJADORCORE) "
                + "LEFT JOIN ADMINPJ.V_PET_CTL_REG_LABORAL VIS_REGLAB "
                + "ON (VIS_TRA.IDREGIMENLABORAL=VIS_REGLAB.IDREGIMENLABORALCORE) "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_UNIDEJE VIS_UNIDEJE "
                + "ON (VIS_TRA.IDAÑO=VIS_UNIDEJE.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA=VIS_UNIDEJE.IDUNIDADEJECUTORACORE) "
                + "LEFT JOIN ADMINPJ.V_PET_CTL_CORTE VIS_CORTE "
                + "ON (VIS_TRA.IDAÑO=VIS_CORTE.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA=VIS_CORTE.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE=VIS_CORTE.IDCORTECORE) "
                + "LEFT JOIN ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP "
                + "ON (VIS_TRA.IDAÑO=VIS_DEP.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA=VIS_DEP.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE=VIS_DEP.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_DEP.IDDEPENDENCIACORE) "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_SEDES VIS_SEDE "
                + "ON (VIS_TRA.IDAÑO=VIS_SEDE.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA=VIS_SEDE.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE=VIS_SEDE.IDCORTE) "
                + "AND (VIS_TRA.IDSEDE=VIS_SEDE.IDCSEDECORE) "
                + "LEFT JOIN ADMINPJ.V_PER_AREASPJ VIS_AREASPJ "
                + "ON (VIS_TRA.IDAÑO=VIS_AREASPJ.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA=VIS_AREASPJ.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE=VIS_AREASPJ.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_AREASPJ.IDDEPENDENCIACORE) "
                + "AND (VIS_TRA.CODAREAINT=VIS_AREASPJ.CODAREAINT) "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_CARGO_SERV VIS_CARGO "
                + "ON (VIS_TRA.IDREGIMENLABORAL=VIS_CARGO.IDREGIMENCORE) "
                + "AND (VIS_TRA.IDCARGO=VIS_CARGO.IDCARGOCORE) "
                + "WHERE TRA.IDTRABAJADOR=" + idtrabajador;

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                while (rs.next()) {
                    f = new Object[22];

                    for (int i = 0; i < f.length; i++) {
                        f[i] = rs.getObject(1 + i);
                    }
                }
            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }
        return f;
    }

    @Override
    public String trabajadoresAct(Integer idtrabajador, String idcore) {
        String result = null;

        //Modificado por AnaCe
        String sql01 = " SELECT "
                + "  CASE TRA.IDSEXO WHEN 'F' THEN 1 ELSE 2 END IDSEXO "
                + " , CASE TRA.IDTIPODOCUMENTO  WHEN '2' THEN 2 ELSE 1 END IDTIPODOCUMENTO "
                + " , TRA.NUMERODOCUMENTOIDENTIDAD "
                + " , TRA.APELLIDOPATERNO "
                + " , TRA.APELLIDOMATERNO "
                + " , TRA.NOMBRE "
                + " , TRA.FECHAINICIO "
                + " , TRA.FECHAFIN "
                + " , CASE TRA.IDESTADOSIGA  WHEN '2' THEN 2 ELSE 1 END IDESTADO "
                + " , TRA.IDPLAZA"
                + " , TRA.IDUNIDADEJECUTORA "
                + " , TRA.IDCORTE "
                + " , TRA.IDSEDE "
                + " , TRA.IDDEPENDENCIA "
                + " , TRA.IDREGIMENLABORAL  "
                + " , TRA.IDCARGO"
                + " , TRA.IDESTADOSIGA"
                + " , TRA.IDAÑO"
                + " , TRA.PERFECNAC"
                + " , NVL(TRA.DIRECCION, '') "
                + " , NVL(TRA.TELEFONOFIJO, '')"
                + " , NVL(TRA.CELULAR, '')"
                + " , NVL(TRA.CORREOELECTR, '')"
                + " FROM ADMINPJ.V_PER_CTL_TRABAJADOR TRA"
                + " WHERE TRA.IDTRABAJADORCORE=?";

        String sql02 = "UPDATE BDTAS.TRABAJADOR SET  "
                + " IDSEXO = ?"
                + " ,  IDTIPODOCUMENTO = ?"
                + " , NUMERODOCUMENTOIDENTIDAD = ?"
                + " , APELLIDOPATERNO          = ?"
                + " , APELLIDOMATERNO          = ?"
                + " , NOMBRE                   = ?"
                + " , FECHAINICIO              =  TO_DATE(?, 'YYYYMMDD') "
                + " , FECHAFIN                 =  NULL "
                + " , IDESTADO                 = ?"
                + " , PERFECNAC                =?"
                + "  WHERE IDTRABAJADOR=?";

        String sql03 = "UPDATE BDTAS.TRABAJADORPJ SET"
                + " IDPLAZA         = ?"
                + " , IDUNIDADEJECUTORA  = ?"
                + " , IDCORTE  = ?"
                + " , IDSEDE = ?"
                + " , IDDEPENDENCIA =?"
                + " , IDREGIMENLABORAL  =?"
                + " , IDCARGO  = ?"
                + " , IDESTADOSIGA = ?"
                + " , IDAÑO   =?"
                + " WHERE IDCORE=?";

        String sql04 = " UPDATE BDTAS.TRABAJADORXDIRECCION"
                + " SET DIRECCION       = ?"
                + " WHERE  IDTRABAJADOR=?"
                + " AND IDDIRECCIONTIPO = 1";

        String sql05 = " UPDATE BDTAS.TRABAJADORXTELEFONO "
                + " SET TELEFONO       = ?"
                + " WHERE IDTRABAJADOR=?  "
                + " AND IDTELEFONOTIPO = 1";

        String sql06
                = "UPDATE BDTAS.TRABAJADORXTELEFONO "
                + " SET TELEFONO       = ? "
                + " WHERE IDTRABAJADOR=? "
                + " AND IDTELEFONOTIPO = 2";

        String sql07 = "UPDATE BDTAS.TRABAJADORXCORREOELECTRONICO "
                + " SET CORREOELECTRONICO       = ?"
                + " WHERE IDTRABAJADOR=? "
                + " AND IDCORREOTIPO = 1";

        String sql08 = "SELECT COUNT(*) FROM BDTAS.TRABAJADORXDIRECCION "
                + " WHERE IDDIRECCIONTIPO=1 AND  IDTRABAJADOR=?";

        String sql09 = "SELECT COUNT(*) FROM BDTAS.TRABAJADORXTELEFONO"
                + " WHERE IDTELEFONOTIPO=1 AND IDTRABAJADOR=?";

        String sql10 = "SELECT COUNT(*) FROM BDTAS.TRABAJADORXTELEFONO"
                + " WHERE IDTELEFONOTIPO=2 AND IDTRABAJADOR=?";

        String sql11 = "SELECT COUNT(*) FROM BDTAS.TRABAJADORXCORREOELECTRONICO"
                + " WHERE IDCORREOTIPO=1 AND IDTRABAJADOR=?";

        String sql12 = "INSERT INTO BDTAS.TRABAJADORXDIRECCION "
                + " ( IDTRABAJADOR"
                + " , IDDIRECCIONTIPO"
                + " , DIRECCION  )"
                + " VALUES "
                + " (?, 1, ?)";

        String sql13 = "INSERT INTO BDTAS.TRABAJADORXTELEFONO"
                + " ( IDTRABAJADOR"
                + " , IDTELEFONOTIPO"
                + " , TELEFONO  )"
                + " VALUES "
                + "(?, 1, ?)";

        String sql14 = "INSERT INTO BDTAS.TRABAJADORXTELEFONO"
                + " ( IDTRABAJADOR"
                + " , IDTELEFONOTIPO"
                + " , TELEFONO  )"
                + " VALUES "
                + "(?, 2, ?)";

        String sql15 = " INSERT INTO BDTAS.TRABAJADORXCORREOELECTRONICO "
                + " ( IDTRABAJADOR"
                + " , IDCORREOTIPO"
                + " , CORREOELECTRONICO   )"
                + "  VALUES "
                + "(?, 1, ?)";

        Connection cn = db.getBdtas();
        Connection cnAdminpj = db.getBdtas();

        Integer idsexo = null;
        Integer idtipodocumento = null;
        String numerodocumentoidentidad = null;
        String apellidopaterno = null;
        String apellidomaterno = null;
        String nombre = null;
        Integer fechainicio = null;
        Integer fechafin = null;
        Integer idestado = null;
        String plaza = null; //pLAZA
        String idunidadejecutora = null;
        String idcorte = null;
        String idsede = null;
        String iddependencia = null;
        String idregimenlaboral = null;
        String idcargo = null;
        String idestadosiga = null;
        String año = null;
        Date perfecnac = null;
        String direccion = null;
        String telefonoFijo = null;
        String telefonoCelular = null;
        String correoElectronico = null;
        String sFechainicio = null;
        String sFechafin = null;

        if (cnAdminpj != null) {
            boolean ok = false;
            try {
                cnAdminpj.setAutoCommit(false);

                // select
                PreparedStatement ps = cnAdminpj.prepareStatement(sql01);
                ps.setString(1, idcore);

                ResultSet rs = ps.executeQuery();

                if (rs.next()) {

                    idsexo = rs.getInt(1);
                    idtipodocumento = rs.getInt(2);
                    numerodocumentoidentidad = rs.getString(3);
                    apellidopaterno = rs.getString(4);
                    apellidomaterno = rs.getString(5);
                    nombre = rs.getString(6);
                    fechainicio = rs.getInt(7);
                    fechafin = rs.getInt(8);
                    idestado = rs.getInt(9);
                    plaza = rs.getString(10);
                    idunidadejecutora = rs.getString(11);
                    idcorte = rs.getString(12);
                    idsede = rs.getString(13);
                    iddependencia = rs.getString(14);
                    idregimenlaboral = rs.getString(15);
                    idcargo = rs.getString(16);
                    idestadosiga = rs.getString(17);
                    año = rs.getString(18);
                    perfecnac = rs.getDate(19);
                    direccion = rs.getString(20);
                    telefonoFijo = rs.getString(21);
                    telefonoCelular = rs.getString(22);
                    correoElectronico = rs.getString(23);
                    sFechainicio = String.valueOf(fechainicio);
                    sFechafin = String.valueOf(fechafin);

                } else {
                    result = "IDCORE: " + idcore + " no existe en DB.";
                    throw new SQLException(result);
                }
                ps.close();

                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cnAdminpj.close();
                } catch (SQLException e) {
                }
            }
        }

        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                // update trabajador
                PreparedStatement ps = cn.prepareStatement(sql02);

                ps.setInt(1, idsexo);
                ps.setInt(2, idtipodocumento);
                ps.setString(3, numerodocumentoidentidad);
                ps.setString(4, apellidopaterno);
                ps.setString(5, apellidomaterno);
                ps.setString(6, nombre);
                ps.setString(7, sFechainicio);
                ps.setInt(8, idestado);
                ps.setDate(9, perfecnac);
                ps.setInt(10, idtrabajador);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "no se pudo actualizar tabla TRABAJADOR";
                    throw new SQLException(result);
                }
                ps.close();

                // update trabajadorpj
                ps = cn.prepareStatement(sql03);
                ps.setString(1, plaza); // contratovigente
                ps.setString(2, idunidadejecutora);
                ps.setString(3, idcorte);
                ps.setString(4, idsede);
                ps.setString(5, iddependencia);
                ps.setString(6, idregimenlaboral);
                ps.setString(7, idcargo);
                ps.setString(8, idestadosiga);
                ps.setString(9, año);
                ps.setString(10, idcore);

                ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "no se pudo actualizar tabla TRABAJADORPJ";
                    throw new SQLException(result);
                }
                ps.close();

                //TRABAJADORXDIRECCION
                ps = cn.prepareStatement(sql08);
                ps.setInt(1, idtrabajador);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    ctos = rs.getInt(1);

                    if (ctos > 0) {

                        // update TRABAJADORXDIRECCION
                        ps = cn.prepareStatement(sql04);
                        ps.setString(1, direccion);
                        ps.setInt(2, idtrabajador);

                        ctos = ps.executeUpdate();
                        if (ctos == 0) {
                            result = "no se pudo actualizar tabla TRABAJADORXDIRECCION";
                            throw new SQLException(result);
                        }
                        ps.close();

                    } else {
                        //insertar TRABAJADORXDIRECCION
                        if ((direccion != null)) {
                            ps = cn.prepareStatement(sql12);
                            ps.setInt(1, idtrabajador);
                            ps.setString(2, direccion);

                            ctos = ps.executeUpdate();
                            if (ctos == 0) {
                                result = "no se pudo insertar tabla TRABAJADORXDIRECCION";
                                throw new SQLException(result);
                            }
                            ps.close();
                        }
                    }

                }
                //at

                // TRABAJADORXTELEFONO FIJO 
                ps = cn.prepareStatement(sql09);
                ps.setInt(1, idtrabajador);

                rs = ps.executeQuery();
                if (rs.next()) {
                    ctos = rs.getInt(1);

                    if (ctos > 0) {
                        // update TRABAJADORXTELEFONO FIJO 
                        ps = cn.prepareStatement(sql05);
                        ps.setString(1, telefonoFijo);
                        ps.setInt(2, idtrabajador);

                        ctos = ps.executeUpdate();
                        if (ctos == 0) {
                            result = "no se pudo actualizar tabla TRABAJADORXTELEFONO - Fijo";
                            throw new SQLException(result);
                        }
                        ps.close();
                    } else {
                        //insertar TRABAJADORXTELEFONO FIJO 
                        if ((telefonoFijo != null)) {
                            ps = cn.prepareStatement(sql13);
                            ps.setInt(1, idtrabajador);
                            ps.setString(2, telefonoFijo);

                            ctos = ps.executeUpdate();
                            if (ctos == 0) {
                                result = "no se pudo insertar tabla TRABAJADORXTELEFONO";
                                throw new SQLException(result);
                            }
                            ps.close();
                        }
                    }
                }
                // update TRABAJADORXTELEFONO CELULAR
                ps = cn.prepareStatement(sql10);
                ps.setInt(1, idtrabajador);

                rs = ps.executeQuery();
                if (rs.next()) {
                    ctos = rs.getInt(1);

                    if (ctos > 0) {

                        ps = cn.prepareStatement(sql06);
                        ps.setString(1, telefonoCelular);
                        ps.setInt(2, idtrabajador);

                        ctos = ps.executeUpdate();
                        if (ctos == 0) {
                            result = "no se pudo actualizar tabla BDTAS.TRABAJADORXTELEFONO - Celular";
                            throw new SQLException(result);
                        }
                        ps.close();

                    } else {
                        //insertar TRABAJADORXTELEFONO
                        if ((telefonoCelular != null)) {
                            ps = cn.prepareStatement(sql14);
                            ps.setInt(1, idtrabajador);
                            ps.setString(2, telefonoCelular);

                            ctos = ps.executeUpdate();
                            if (ctos == 0) {
                                result = "no se pudo insertar tabla BDTAS.TRABAJADORXTELEFONO - Celular";
                                throw new SQLException(result);
                            }
                            ps.close();
                        }
                    }

                }

//FIN
                // update TRABAJADORXCORREOELECTRONICO
                //at
                ps = cn.prepareStatement(sql11);
                ps.setInt(1, idtrabajador);

                rs = ps.executeQuery();
                if (rs.next()) {
                    ctos = rs.getInt(1);

                    if (ctos > 0) {

                        ps = cn.prepareStatement(sql07);
                        ps.setString(1, correoElectronico);
                        ps.setInt(2, idtrabajador);

                        ctos = ps.executeUpdate();
                        if (ctos == 0) {
                            result = "no se pudo actualizar tabla TRABAJADORXCORREOELECTRONICO";
                            throw new SQLException(result);
                        }
                        ps.close();

                    } else {
                        //insertar TRABAJADORXCORREOELECTRONICO
                        if ((correoElectronico != null)) {
                            ps = cn.prepareStatement(sql15);
                            ps.setInt(1, idtrabajador);
                            ps.setString(2, correoElectronico);

                            ctos = ps.executeUpdate();
                            if (ctos == 0) {
                                result = "no se pudo insertar tabla TRABAJADORXCORREOELECTRONICO";
                                throw new SQLException(result);
                            }
                            ps.close();
                        }
                    }

                }
                //at

                //FIN
                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public boolean trabajadoresExiste(String nroDocumento) {
        boolean result = false;
        String sql = "SELECT COUNT(*) FROM BDTAS.TRABAJADOR  TRA "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + "ON TRA.IDTRABAJADORCORE=VIS_TRA.IDTRABAJADORCORE "
                + "WHERE VIS_TRA.NUMERODOCUMENTOIDENTIDAD=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setString(1, nroDocumento);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    int ctos = rs.getInt(1);

                    if (ctos > 0) {
                        result = true;
                    }
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return result;
    }

    @Override
    public List<Object[]> trabajadoresImp1(String nroDocumento) {
        List<Object[]> list = null;
        String sql
                = " SELECT  VIS_TRA.IDTRABAJADORCORE, "
                + " VIS_TRA.APELLIDOPATERNO   ||  ' ' ||  VIS_TRA.APELLIDOMATERNO ||  ', ' || VIS_TRA.NOMBRE TRABAJADOR, "
                + " VIS_DEP.DESCRIPCIONDEPENDENCIA DEPENDENCIA, "
                + " VIS_AREA.DESCRIPCIONAREAS AREAS, "
                + " VIS_TRA.APELLIDOPATERNO AP, "
                + " VIS_TRA.APELLIDOMATERNO AM, "
                + " VIS_TRA.NOMBRE NOM, "
                + " VIS_TRA.CORREOELECTR EMAIL "
                + " FROM ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + " LEFT JOIN ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP "
                + " ON (VIS_TRA.IDAÑO = VIS_DEP.IDAÑO) "
                + " AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_DEP.IDUNIDADEJECUTORA) "
                + " AND (VIS_TRA.IDCORTE = VIS_DEP.IDCORTE) "
                + " AND (VIS_TRA.IDDEPENDENCIA=VIS_DEP.IDDEPENDENCIACORE) "
                + " LEFT JOIN ADMINPJ.V_PER_AREASPJ VIS_AREA "
                + " ON (VIS_TRA.IDAÑO = VIS_AREA.IDAÑO) "
                + " AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_AREA.IDUNIDADEJECUTORA) "
                + " AND (VIS_TRA.IDCORTE = VIS_AREA.IDCORTE) "
                + " AND (VIS_TRA.IDDEPENDENCIA=VIS_AREA.IDDEPENDENCIACORE) "
                + " AND (VIS_TRA.CODAREAINT=VIS_AREA.CODAREAINT)"
                + " WHERE  VIS_TRA.IDESTADOSIGA ='1' AND "
                + " VIS_TRA.NUMERODOCUMENTOIDENTIDAD='" + nroDocumento + "'";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[8];

                    f[0] = rs.getObject(1); // TRACORE.IDCORE
                    f[1] = rs.getObject(2); // TRABAJADOR
                    f[2] = rs.getObject(3); // DEPENDENCIA
                    f[3] = rs.getObject(4); // AREA
                    f[4] = rs.getObject(5); // AP
                    f[5] = rs.getObject(6); // AM
                    f[6] = rs.getObject(7); // NOMBRE
                    f[7] = rs.getObject(8); // EMAIL
                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    @SuppressWarnings("null")
    public String trabajadoresImp2(String idcore, String usuario, String vappa, String vapma, String vnomsim) {
        String result = null;

        usuario = usuario.toLowerCase();

        String sql = " INSERT INTO BDTAS.TRABAJADOR"
                + " (   IDTRABAJADORCORE )"
                + "  VALUES  "
                + " ('" + idcore + "')";

        String sql02 = "INSERT INTO BDTAS.USUARIOS "
                + "( APELLIDOS, NOMBRES, CORREO,  PASSWORD, AUTORIZACION, IDTRABAJADOR ) "
                + " VALUES (  ?, ?, ?, ?, ?, ? )";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {

                String correo = null;
                String contraseña = null;
                String autorizacion = null;
                int idtrabajador = 0;

                PreparedStatement ps = cn.prepareStatement(sql, new String[]{"IDTRABAJADOR"});

                int ctos = ps.executeUpdate();

                if (ctos > 0) {
                    ResultSet rs = ps.getGeneratedKeys();
                    rs.next();
                    idtrabajador = rs.getInt(1); // idtrabajador generado
                } else {
                    if (ctos == 0) {
                        result = "0 filas afectadas";
                    }

                }
                ps.close();

                ps = cn.prepareStatement(sql02);

                correo = usuario;
                contraseña = "Æ|Pï·ÙÍªeÉ]";
                autorizacion = "ADMIN";

                ps.setString(1, (vappa + ' ' + vapma));
                ps.setString(2, vnomsim);
                ps.setString(3, correo);
                ps.setString(4, contraseña);
                ps.setString(5, autorizacion);
                ps.setInt(6, idtrabajador);

                ctos = ps.executeUpdate();

                if (ctos == 0) {
                    result = "0 filas afectadas";

                }
                ps.close();

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;

    }

    @Override
    public List<Object[]> trabajadoresJef(String idannio, String iduejecutora, String idcorte) {
        List<Object[]> list = null;
        String sql = "SELECT "
                + "VIS_DEP.IDAÑO,"
                + "VIS_DEP.IDUNIDADEJECUTORA,"
                + "VIS_DEP.IDCORTE,"
                + "VIS_DEP.IDDEPENDENCIACORE,"
                + " VIS_DEP.DESCRIPCIONDEPENDENCIA,"
                + "VIS_TRA.APELLIDOPATERNO   ||  ' ' ||  VIS_TRA.APELLIDOMATERNO ||  ' ' || VIS_TRA.NOMBRE AS TRABAJADOR,"
                + " TO_CHAR(JEFE.FECHAINICIO, 'DD/MM/YYYY' ) "
                + "FROM ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP "
                + "LEFT JOIN BDTAS.JEFE JEFE "
                + "ON (VIS_DEP.IDAÑO=JEFE.IDAÑO) "
                + "AND (VIS_DEP.IDUNIDADEJECUTORA=JEFE.IDUNIDADEJECUTORA) "
                + "AND (VIS_DEP.IDCORTE=JEFE.IDCORTE) "
                + "AND (VIS_DEP.IDDEPENDENCIACORE =JEFE.IDDEPENDENCIA) "
                + "AND (JEFE.IDESTADO=1) "
                + "LEFT JOIN BDTAS.TRABAJADOR  TRA "
                + "ON (TRA.IDTRABAJADOR=JEFE.IDTRABAJADOR) "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + "ON (VIS_TRA.IDTRABAJADORCORE=TRA.IDTRABAJADORCORE) "
                + "WHERE VIS_DEP.ESTADODEPENDENCIA='1' "
                + "AND VIS_DEP.IDAÑO=? "
                + "AND VIS_DEP.IDUNIDADEJECUTORA=? "
                + "AND VIS_DEP.IDCORTE=? "
                + "ORDER BY 5";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setString(1, idannio);
                ps.setString(2, iduejecutora);
                ps.setString(3, idcorte);

                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[7];

                    f[0] = rs.getObject(1); // IDAÑO
                    f[1] = rs.getObject(2); // IDUNIDADEJECUTORA
                    f[2] = rs.getObject(3); // IDCORTE
                    f[3] = rs.getObject(4); // IDDEPENDENCIACORE
                    f[4] = rs.getObject(5); // DESCRIPCIONDEPENDENCIA
                    f[5] = rs.getObject(6); // TRABAJADO
                    f[6] = rs.getObject(7); // FECHA

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public List<Object[]> trabajadoresJef2(String filtro) {
        List<Object[]> list = null;
        String sql = "SELECT "
                + "TRA.IDTRABAJADOR,"
                + "VIS_TRA.APELLIDOPATERNO   ||  ' ' ||  VIS_TRA.APELLIDOMATERNO ||  ' ' || VIS_TRA.NOMBRE AS TRABAJADOR,"
                + "VIS_REGLAB.DESCRIPCIONREGIMENLABORAL REGIMEN,"
                + "VIS_CARGO.DESCRIPCIONCARGO CARGO,"
                + "VIS_TRA.NUMERODOCUMENTOIDENTIDAD "
                + "FROM BDTAS.TRABAJADOR TRA "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + "ON (VIS_TRA.IDTRABAJADORCORE = TRA.IDTRABAJADORCORE) "
                + "LEFT JOIN ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP "
                + "ON (VIS_TRA.IDAÑO = VIS_DEP.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_DEP.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE = VIS_DEP.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_DEP.IDDEPENDENCIACORE) "
                + "LEFT JOIN ADMINPJ.V_PET_CTL_REG_LABORAL VIS_REGLAB "
                + "ON (VIS_TRA.IDREGIMENLABORAL=VIS_REGLAB.IDREGIMENLABORALCORE) "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_CARGO_SERV VIS_CARGO "
                + "ON (VIS_TRA.IDREGIMENLABORAL=VIS_CARGO.IDREGIMENCORE) "
                + "AND (VIS_TRA.IDCARGO=VIS_CARGO.IDCARGOCORE) "
                + " WHERE " + filtro
                + " ORDER BY 2";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[5];

                    f[0] = rs.getObject(1); // IDTRABAJADOR
                    f[1] = rs.getObject(2); // TRABAJADOR
                    f[2] = rs.getObject(3); // REGIMEN
                    f[3] = rs.getObject(4); // CARGO
                    f[4] = rs.getObject(5); // NUMERODOCUMENTOIDENTIDAD

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String trabajadoresJefIns(String iddependencia, String idannio, String iduejecutora, String idcorte, Integer idtrabajador, String fecha) {
        String result = null;
        String sql01 = "UPDATE BDTAS.JEFE SET IDESTADO=2 "
                + "WHERE IDAÑO=? "
                + "AND IDUNIDADEJECUTORA=? "
                + "AND IDCORTE=? "
                + "AND IDDEPENDENCIA=?";

        String sql02 = "SELECT NVL(MAX(IDCORRELATIVO), 0) + 1 "
                + "FROM BDTAS.JEFE "
                + "WHERE IDAÑO=? "
                + "AND IDUNIDADEJECUTORA=? "
                + "AND IDCORTE=? "
                + "AND IDDEPENDENCIA=?";

        String sql03 = "INSERT INTO BDTAS.JEFE("
                + "IDAÑO,"
                + "IDUNIDADEJECUTORA,"
                + "IDCORTE,"
                + "IDDEPENDENCIA,"
                + "IDCORRELATIVO,"
                + "IDTRABAJADOR,"
                + "IDESTADO,"
                + "FECHAINICIO"
                + ") VALUES("
                + "?,"
                + "?,"
                + "?,"
                + "?,"
                + "?,"
                + "?,"
                + "1,"
                + "TO_DATE(?, 'DD/MM/YYYY')"
                + ")";

        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                // retirar jefe
                PreparedStatement ps = cn.prepareStatement(sql01);
                ps.setString(1, idannio);
                ps.setString(2, iduejecutora);
                ps.setString(3, idcorte);
                ps.setString(4, iddependencia);

                ps.executeUpdate();

                /* 
                 int ctos
                 if (ctos == 0) {
                 result = "No se pudo actualizar Jefe";
                 throw new SQLException(result);
                 }
                 */
                ps.close();

                // correlativo
                ps = cn.prepareStatement(sql02);
                ps.setString(1, idannio);
                ps.setString(2, iduejecutora);
                ps.setString(3, idcorte);
                ps.setString(4, iddependencia);

                ResultSet rs = ps.executeQuery();
                Integer nidcorrelativo = null;
                if (rs.next()) {
                    nidcorrelativo = rs.getInt(1);
                } else {
                    throw new SQLException("Error al generar Correlativo");
                }
                ps.close();

                // insertar jefe
                ps = cn.prepareStatement(sql03);
                ps.setString(1, idannio);
                ps.setString(2, iduejecutora);
                ps.setString(3, idcorte);
                ps.setString(4, iddependencia);
                ps.setInt(5, nidcorrelativo);
                ps.setInt(6, idtrabajador);
                ps.setString(7, fecha);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "No se pudo registrar Jefe";
                    throw new SQLException(result);
                }
                ps.close();

                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public List<Object[]> trabajadoresJefCon(String filtro) {
        List<Object[]> list = null;
        String sql = "SELECT TO_CHAR(JEFE.FECHAINICIO, 'DD/MM/YYYY') FECINICIO,"
                + "VIS_TRA.APELLIDOPATERNO   ||  ' ' ||  VIS_TRA.APELLIDOMATERNO ||  ' ' || VIS_TRA.NOMBRE TRABAJADOR,"
                + "EST.DESCRIPCIONESTADO ESTADO "
                + "FROM BDTAS.JEFE JEFE "
                + "LEFT JOIN BDTAS.TRABAJADOR TRA "
                + "ON (TRA.IDTRABAJADOR = JEFE.IDTRABAJADOR) "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + "ON (VIS_TRA.IDTRABAJADORCORE=TRA.IDTRABAJADORCORE) "
                + "LEFT JOIN BDTAS.ESTADO EST "
                + "ON ( JEFE.IDESTADO = EST.IDESTADO) "
                + filtro
                + " ORDER BY 3";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[3];

                    f[0] = rs.getObject(1); // FECHAINICIO
                    f[1] = rs.getObject(2); // TRABAJADOR
                    f[2] = rs.getObject(3); // ESTADO

                    list.add(f);
                }
            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public boolean UsuarioExiste(String usuario) {
        boolean result = false;
        String sql = " SELECT COUNT(*) FROM BDTAS.USUARIOS  "
                + "WHERE correo='" + usuario + "'";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    int ctos = rs.getInt(1);

                    if (ctos > 0) {
                        result = true;
                    }
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return result;
    }

    @Override
    public List<Object[]> trabajadoresProgQry(String filtro, String periodo, String periodoTexto) {
        List<Object[]> list = null;
        String sql = "SELECT  "
                + "TRA.IDTRABAJADOR,"
                + "VIS_TRA.IDESTADOSIGA IDESTADO,"
                + "VIS_TRA.APELLIDOPATERNO   ||  ' ' ||  VIS_TRA.APELLIDOMATERNO ||  ', ' || VIS_TRA.NOMBRE TRABAJADOR,"
                + "VIS_TRA.NUMERODOCUMENTOIDENTIDAD, "
                + "'" + periodoTexto + "' PERIODO, "
                + " CASE WHEN TO_CHAR (FECTRA.IDFECHA,'YYYYMM') IS NULL THEN ' ' ELSE 'SI' END PROGRAMACION,"
                + " NVL(VIS_DEP.DESCRIPCIONDEPENDENCIA, ' ' ) DEPENDENCIA,"
                + " NVL(VIS_AREA.DESCRIPCIONAREAS, ' ' ) AREAS,"
                + "CASE WHEN VIS_TRA.IDESTADOSIGA='1' THEN 'ACTIVO' ELSE 'INACTIVO' END ESTADO "
                //  + "'" + periodo + "' "
                + "FROM BDTAS.TRABAJADOR TRA LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA ON (VIS_TRA.IDTRABAJADORCORE=TRA.IDTRABAJADORCORE) "
                + "LEFT JOIN ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP ON (VIS_TRA.IDAÑO = VIS_DEP.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_DEP.IDUNIDADEJECUTORA) AND (VIS_TRA.IDCORTE = VIS_DEP.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_DEP.IDDEPENDENCIACORE) LEFT JOIN ADMINPJ.V_PER_AREASPJ VIS_AREA "
                + "ON (VIS_TRA.IDAÑO = VIS_AREA.IDAÑO) AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_AREA.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE = VIS_AREA.IDCORTE) AND (VIS_TRA.IDDEPENDENCIA=VIS_AREA.IDDEPENDENCIACORE) "
                + "AND (VIS_TRA.CODAREAINT=VIS_AREA.CODAREAINT) "
                + "LEFT JOIN BDTAS.FECHAXTRABAJADOR FECTRA "
                + "ON (FECTRA.IDTRABAJADOR=TRA.IDTRABAJADOR AND TO_CHAR(IDFECHA, 'YYYYMM')='" + periodo + "') "
                + "WHERE " + filtro;

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery(sql);

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[9];

                    f[0] = rs.getObject(1); // IDTRABAJADOR
                    f[1] = rs.getObject(2); // IDESTADO
                    f[2] = rs.getObject(3); // TRABAJADOR
                    f[3] = rs.getObject(4); // NUMERODOCUMENTOIDENTIDAD
                    f[4] = rs.getObject(5); // PERIODO TEXT
                    f[5] = rs.getObject(6); // PROGRAMACION 
                    f[6] = rs.getObject(7); // DEPENDENCIA
                    f[7] = rs.getObject(8); // AREAS
                    f[8] = rs.getObject(9); // ESTADO
                    //    f[9] = rs.getObject(10); // PERIDDO COD

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public List<Object[]> trabajadoresJefQry(String idannio, String iduejecutora, String idcorte, long numpag, long filsXpag) {
        List<Object[]> list = null;
        String sql = "SELECT * FROM " // adicional a consulta
                + "(SELECT rownum rnum, a.* FROM ( " // adicional a consulta
                + "SELECT "
                + "VIS_DEP.IDAÑO,"
                + "VIS_DEP.IDUNIDADEJECUTORA,"
                + "VIS_DEP.IDCORTE,"
                + "VIS_DEP.IDDEPENDENCIACORE,"
                + " VIS_DEP.DESCRIPCIONDEPENDENCIA,"
                + "VIS_TRA.APELLIDOPATERNO   ||  ' ' ||  VIS_TRA.APELLIDOMATERNO ||  ' ' || VIS_TRA.NOMBRE AS TRABAJADOR,"
                + " TO_CHAR(JEFE.FECHAINICIO, 'DD/MM/YYYY' ) "
                + "FROM ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP "
                + "LEFT JOIN BDTAS.JEFE JEFE "
                + "ON (VIS_DEP.IDAÑO=JEFE.IDAÑO) "
                + "AND (VIS_DEP.IDUNIDADEJECUTORA=JEFE.IDUNIDADEJECUTORA) "
                + "AND (VIS_DEP.IDCORTE=JEFE.IDCORTE) "
                + "AND (VIS_DEP.IDDEPENDENCIACORE =JEFE.IDDEPENDENCIA) "
                + "AND (JEFE.IDESTADO=1) "
                + "LEFT JOIN BDTAS.TRABAJADOR  TRA "
                + "ON (TRA.IDTRABAJADOR=JEFE.IDTRABAJADOR) "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + "ON (VIS_TRA.IDTRABAJADORCORE=TRA.IDTRABAJADORCORE) "
                + "WHERE VIS_DEP.ESTADODEPENDENCIA='1' "
                + "AND VIS_DEP.IDAÑO=? "
                + "AND VIS_DEP.IDUNIDADEJECUTORA=? "
                + "AND VIS_DEP.IDCORTE=? "
                + "ORDER BY 5"
                + ") a WHERE rownum <= ?) " // adicional a consulta
                + "WHERE rnum > ?"; // adicional a consulta;

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setString(1, idannio);
                ps.setString(2, iduejecutora);
                ps.setString(3, idcorte);
                ps.setLong(4, ((1 + numpag) * filsXpag));
                ps.setLong(5, (numpag * filsXpag));

                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[7];

                    f[0] = rs.getObject(1); // IDAÑO
                    f[1] = rs.getObject(2); // IDUNIDADEJECUTORA
                    f[2] = rs.getObject(3); // IDCORTE
                    f[3] = rs.getObject(4); // IDDEPENDENCIACORE
                    f[4] = rs.getObject(5); // DESCRIPCIONDEPENDENCIA
                    f[5] = rs.getObject(6); // TRABAJADO
                    f[6] = rs.getObject(7); // FECHA

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public Integer[] trabajadoresJefQryPag(String idannio, String iduejecutora, String idcorte, long filsXpag) {
        Integer[] result = null;
        String sql = "SELECT COUNT(*) "
                + "FROM ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP "
                + "LEFT JOIN BDTAS.JEFE JEFE "
                + "ON (VIS_DEP.IDAÑO=JEFE.IDAÑO) "
                + "AND (VIS_DEP.IDUNIDADEJECUTORA=JEFE.IDUNIDADEJECUTORA) "
                + "AND (VIS_DEP.IDCORTE=JEFE.IDCORTE) "
                + "AND (VIS_DEP.IDDEPENDENCIACORE =JEFE.IDDEPENDENCIA) "
                + "AND (JEFE.IDESTADO=1) "
                + "LEFT JOIN BDTAS.TRABAJADOR  TRA "
                + "ON (TRA.IDTRABAJADOR=JEFE.IDTRABAJADOR) "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + "ON (VIS_TRA.IDTRABAJADORCORE=TRA.IDTRABAJADORCORE) "
                + "WHERE VIS_DEP.ESTADODEPENDENCIA='1' "
                + "AND VIS_DEP.IDAÑO=? "
                + "AND VIS_DEP.IDUNIDADEJECUTORA=? "
                + "AND VIS_DEP.IDCORTE=? ";
//                + "ORDER BY 5";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setString(1, idannio);
                ps.setString(2, iduejecutora);
                ps.setString(3, idcorte);
                ResultSet rs = ps.executeQuery();

                if (rs.next()) {
                    // total filas de consulta
                    Integer totalfils = rs.getInt(1);

                    // cantidad de paginas con filsXpag
                    Integer ctasPags = (totalfils % filsXpag) == 0
                            ? (totalfils / (int) filsXpag)
                            : (totalfils / (int) filsXpag + 1);

                    result = new Integer[2];
                    result[0] = ctasPags;
                    result[1] = totalfils;
                }
            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }
        return result;
    }

}
